"""
给你一个整数数组 nums ，判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ，
同时还满足 nums[i] + nums[j] + nums[k] == 0 。
请你返回所有和为 0 且不重复的三元组。
注意：答案中不可以包含重复的三元组。
"""


def threeSum(nums: list[int]) -> list[list[int]]:
    # 定义接收返回条件的数组
    threesum = []

    # 给nums排序
    nums.sort()

    long = len(nums)
    # 如果长度小于3,不可能有三个数的和
    if len(nums) < 3:
        return threesum
    # 遍历数组
    for i in range(long):
        # 如果最左边的数（最小的数：排了序的）大于0，那三数之和不可能等于0
        if nums[i] > 0:
            break
        # 当i>=1（0会报错）时，如果和前面的数相同，就可以用continue跳过，不执行，避免结果重复。
        if i > 0 and nums[i] == nums[i - 1]:
            continue
        # 定义左右界限
        left = i + 1
        right = long - 1
        # 停止条件 left == right
        while left < right:
            # 定义三数之和
            sum1 = nums[i] + nums[left] + nums[right]
            # 当sum1 = 0时，就可以三个数加入threenum
            if not sum1:
                threesum.append([nums[i], nums[left], nums[right]])
                # 去除相同的三个数， 加left < right，避免超过index上限,如nums = [0,0,0]
                while left < right and nums[left] == nums[left + 1]:
                    left += 1
                while left < right and nums[right] == nums[right - 1]:
                    right -= 1
                left += 1
                right -= 1
            # 判断sum1在0的左边右边进行调整
            elif sum1 < 0:
                left += 1
            else:
                right -= 1
    return threesum


nums = [0, 0, 0]
print(threeSum(nums))
